/*
 * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.corba.se.impl.legacy.connection;

import java.net.ServerSocket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import org.omg.CORBA.INITIALIZE;
import org.omg.CORBA.INTERNAL;
import org.omg.CORBA.CompletionStatus;

import com.sun.corba.se.pept.transport.Acceptor;
import com.sun.corba.se.pept.transport.ByteBufferPool;
import com.sun.corba.se.pept.transport.ContactInfo;
import com.sun.corba.se.pept.transport.Selector;

import com.sun.corba.se.spi.ior.IOR;
import com.sun.corba.se.spi.ior.iiop.IIOPProfile;
import com.sun.corba.se.spi.ior.ObjectKeyTemplate;
import com.sun.corba.se.spi.ior.ObjectId;
import com.sun.corba.se.spi.orb.ORB;
import com.sun.corba.se.spi.transport.CorbaTransportManager;
import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketEndPointInfo;
import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketManager;
import com.sun.corba.se.spi.transport.SocketOrChannelAcceptor;
import com.sun.corba.se.spi.logging.CORBALogDomains;

import com.sun.corba.se.impl.encoding.EncapsOutputStream;
import com.sun.corba.se.impl.legacy.connection.SocketFactoryAcceptorImpl;
import com.sun.corba.se.impl.legacy.connection.USLPort;
import com.sun.corba.se.impl.orbutil.ORBUtility;
import com.sun.corba.se.impl.transport.SocketOrChannelAcceptorImpl;
import com.sun.corba.se.impl.logging.ORBUtilSystemException;

public class LegacyServerSocketManagerImpl
    implements
    LegacyServerSocketManager {

  protected ORB orb;
  private ORBUtilSystemException wrapper;

  public LegacyServerSocketManagerImpl(ORB orb) {
    this.orb = orb;
    wrapper = ORBUtilSystemException.get(orb,
        CORBALogDomains.RPC_TRANSPORT);
  }

  ////////////////////////////////////////////////////
  //
  // LegacyServerSocketManager
  //

  // Only used in ServerManagerImpl.
  public int legacyGetTransientServerPort(String type) {
    return legacyGetServerPort(type, false);
  }

  // Only used by POAPolicyMediatorBase.
  public synchronized int legacyGetPersistentServerPort(String socketType) {
    if (orb.getORBData().getServerIsORBActivated()) {
      // this server is activated by orbd
      return legacyGetServerPort(socketType, true);
    } else if (orb.getORBData().getPersistentPortInitialized()) {
      // this is a user-activated server
      return orb.getORBData().getPersistentServerPort();
    } else {
      throw wrapper.persistentServerportNotSet(
          CompletionStatus.COMPLETED_MAYBE);
    }
  }

  // Only used by PI IORInfoImpl.
  public synchronized int legacyGetTransientOrPersistentServerPort(
      String socketType) {
    return legacyGetServerPort(socketType,
        orb.getORBData()
            .getServerIsORBActivated());
  }

  // Used in RepositoryImpl, ServerManagerImpl, POAImpl,
  // POAPolicyMediatorBase, TOAImpl.
  // To get either default or bootnaming endpoint.
  public synchronized LegacyServerSocketEndPointInfo legacyGetEndpoint(
      String name) {
    Iterator iterator = getAcceptorIterator();
    while (iterator.hasNext()) {
      LegacyServerSocketEndPointInfo endPoint = cast(iterator.next());
      if (endPoint != null && name.equals(endPoint.getName())) {
        return endPoint;
      }
    }
    throw new INTERNAL("No acceptor for: " + name);
  }

  // Check to see if the given port is equal to any of the ORB Server Ports.
  // XXX Does this need to change for the multi-homed case?
  // Used in IIOPProfileImpl, ORBImpl.
  public boolean legacyIsLocalServerPort(int port) {
    Iterator iterator = getAcceptorIterator();
    while (iterator.hasNext()) {
      LegacyServerSocketEndPointInfo endPoint = cast(iterator.next());
      if (endPoint != null && endPoint.getPort() == port) {
        return true;
      }
    }
    return false;
  }

  ////////////////////////////////////////////////////
  //
  // Implementation.
  //

  private int legacyGetServerPort(String socketType, boolean isPersistent) {
    Iterator endpoints = getAcceptorIterator();
    while (endpoints.hasNext()) {
      LegacyServerSocketEndPointInfo ep = cast(endpoints.next());
      if (ep != null && ep.getType().equals(socketType)) {
        if (isPersistent) {
          return ep.getLocatorPort();
        } else {
          return ep.getPort();
        }
      }
    }
    return -1;
  }

  private Iterator getAcceptorIterator() {
    Collection acceptors =
        orb.getCorbaTransportManager().getAcceptors(null, null);
    if (acceptors != null) {
      return acceptors.iterator();
    }

    throw wrapper.getServerPortCalledBeforeEndpointsInitialized();
  }

  private LegacyServerSocketEndPointInfo cast(Object o) {
    if (o instanceof LegacyServerSocketEndPointInfo) {
      return (LegacyServerSocketEndPointInfo) o;
    }
    return null;
  }

  protected void dprint(String msg) {
    ORBUtility.dprint("LegacyServerSocketManagerImpl", msg);
  }
}

// End of file.
